package com.tmt.jpa.jpaservice;

import org.springframework.data.domain.Example;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 本模块主要目的是完成实体对象的CRUD操作。
 * 在实际项目中，大部分实体类CRUD操作都是统一模式，但是也存在某些类的某些CRUD操作需要特殊处理。
 * 本模块致力于提供一套统一的CRUD操作方法，并可以方便的扩展，为特殊CRUD操作的插入提供便利。
 * Created by ThreeManTeam on 2017/6/9.
 */
public interface ITmtJpaService<T, ID extends Serializable> {

    boolean support(Class<T> clazz);

    T create(T object) throws Exception;

    List<T> createAll(List<T> objects) throws Exception;

    T update(T object) throws Exception;

    List<T> updateAll(List<T> objects) throws Exception;

    void delete(T object) throws Exception;

    void deleteAll(List<T> objects) throws Exception;

    T findById(Class<T> clazz, ID id);

    T findById(ID id);

    List<T> findAll(Class<T> clazz, Example<T> example);


    /**
     * 查找并加载实体对象及其懒加载属性。
     *
     * @param clazz
     * @param id
     * @param lazyLoadName 懒加载属性分组序号，对应实体类上标注的@LazyLoadDefine注解中@LazyLoadMapping的name属性值。
     * @return
     */
    <K> K loadEntity(Class<K> clazz, ID id, String lazyLoadName) throws Exception;

    /**
     * 通过调用指定的方法返回对象及其懒加载属性。
     *
     * @param clazz        要加载的目标类
     * @param methodName
     * @param args
     * @param lazyLoadName
     * @return
     */
    <K> K loadEntity(Class<K> clazz, String methodName, Object[] args, String lazyLoadName) throws Exception;


    <K> List<K> loadEntities(Class<K> clazz, String methodName, Object[] args, String lazyLoadName) throws Exception;


    <K> void loadLazyProperties(K entity, String[] lazyProperties);

    <K> void loadLazyProperties(Collection<K> entityList, String[] lazyProperties);
}
